package cn.jsj.onclock.service;

import cn.jsj.onclock.aop.PageNum;
import cn.jsj.onclock.aop.PageSize;
import cn.jsj.onclock.aop.PrimaryKeyParam;
import cn.jsj.onclock.pojo.GroupEnt;
import cn.jsj.onclock.pojo.UserEnt;
import cn.jsj.onclock.pojo.UserGroupInfo;
import cn.jsj.onclock.pojo.identity.GroupJoinAuthEnum;
import cn.jsj.onclock.pojo.identity.UserIdentityEnum;
import com.github.pagehelper.PageInfo;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;
import org.springframework.validation.annotation.Validated;

import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * @author 卢斌
 */
@Validated
public interface GroupService {

    /**
     * 创建一个群组
     *
     * @param groupName     群名称
     * @param creatorId     创建者Id
     * @param userIdentity  用户角色
     * @return 新群Id
     */
    Long creatGroup(@NotBlank@Length(max = 40) String groupName, @PrimaryKeyParam Long creatorId, @NotNull UserIdentityEnum userIdentity);


    /**
     * 获取用户加入的群组列表，分页显示
     *
     * @param userId    用户Id
     * @param pageNum   页码
     * @param pageSize  页容量
     * @return  用户加入的群组
     */
    List<UserGroupInfo> listUserGroupInformationAboutUser(@PrimaryKeyParam Long userId, @PageNum Integer pageNum, @PageSize Integer pageSize);


    /**
     * 获取某一群组内的成员信息
     *
     * @param userId    用户Id
     * @param groupId   群组Id
     * @param pageNum   页码号
     * @param pageSize  页容量
     * @return  该群内的所有成员信息
     */
    List<UserGroupInfo> listUserInfoInGroup(@PrimaryKeyParam Long userId, @PrimaryKeyParam Long groupId, @PageNum Integer pageNum, @PageSize Integer pageSize);


    /**
     * 获取某一群组内的成员信息
     *
     * @param userId    用户Id
     * @param groupId   群组Id
     * @return  该群内的所有成员信息
     */
    List<UserGroupInfo> listUserInfoInGroupWithoutPage(@PrimaryKeyParam Long userId, @PrimaryKeyParam Long groupId);



    /**
     * 修改群组名称
     *
     * @param userId    用户Id
     * @param groupId   群组Id
     * @param newName   群组新名称
     * @return  新名称
     */
    String updateGroupName(@PrimaryKeyParam Long userId, @PrimaryKeyParam Long groupId, @NotBlank@Length(max = 40) String newName);


    /**
     * 解散一个群组
     *
     * @param userId  用户Id
     * @param groupId 群组Id
     * @return 数据库影响条数
     */
    Long deleteOneGroup(@PrimaryKeyParam Long userId, @PrimaryKeyParam Long groupId);


    /**
     * 模糊查询群组列表
     *
     * @param pageNum           页码号
     * @param pageSize          页容量
     * @param groupNamePrefix   群名称前缀
     * @return  符合前缀规则的群列表
     */
    List<GroupEnt> findNameGroup(@NotBlank@Length(min = 1, max = 10) String groupNamePrefix, @PageNum Integer pageNum, @PageSize Integer pageSize);


    /**
     * 获取用户在某群组中的成员信息（一般用于检查用户是否在该群组中）
     *
     * @param userId  用户Id
     * @param groupId 群组Id
     * @return 用户在该群中的成员信息
     */
    UserGroupInfo getUserGroupInfo(@PrimaryKeyParam Long userId, @PrimaryKeyParam Long groupId);


    /**
     * 用户修改群审批方式
     *
     * @param userId        操作用户Id
     * @param groupId       群组Id
     * @param authEnum      默认审批方式
     */
    void updateGroupAuthWay(@PrimaryKeyParam Long userId, @PrimaryKeyParam Long groupId, @NotNull GroupJoinAuthEnum authEnum);


    /**
     * 查询符合前缀规则的用户已经加入的群组
     *
     * @param userId    用户Id
     * @param prefix    模糊查询前缀
     * @param pageNum   页码号
     * @param pageSize  页容量
     * @return  符合前缀规则的用户已经加入的群组
     */
    List<UserGroupInfo> listGroupLikePrefixNameAboutUser(@PrimaryKeyParam Long userId, @NotBlank@Length(max = 40, min = 1) String prefix, @PageNum Integer pageNum, @PageSize Integer pageSize);


    /**
     * 查询群组中的某位用户的个人信息
     *
     * @param userId    用户Id
     * @param friendId  群友Id
     * @param groupId   群组Id
     * @return  群友个人信息
     */
    UserEnt getOneGroupFriendInfo(@PrimaryKeyParam Long userId, @PrimaryKeyParam Long friendId, @PrimaryKeyParam Long groupId);


}
